OBJDIR = Objs
TARGET = app
CC = g++
CFLAGS += -Wall -g -DDEBUG=1
VPATH = $(OBJDIR)

all: $(OBJDIR) $(TARGET)
	@make -C Matrix
	@make -C Cloud

# Create object directory when it doesn't exists.
$(OBJDIR):
	@if [ ! -d $(OBJDIR) ]; then \
		echo "creating directory: $(OBJDIR)"; \
		mkdir $(OBJDIR); \
	fi

$(TARGET): demo.o module.o factor.o cost_function.o matrix_operation.o cloud_client.o gpu_client.o
	$(CC) $(CFLAGS) -lrt -o $(TARGET) \
			$(OBJDIR)/demo.o $(OBJDIR)/module.o $(OBJDIR)/factor.o $(OBJDIR)/cost_function.o \
			$(OBJDIR)/matrix_operation.o $(OBJDIR)/cloud_client.o $(OBJDIR)/gpu_client.o

demo.o: demo.cpp
	$(CC) $(CFLAGS) -o $(OBJDIR)/$@ -c demo.cpp

module.o: module.cpp base.h factor.h cost_function.h
	$(CC) $(CFLAGS) -o $(OBJDIR)/$@ -c module.cpp

factor.o: base.h factor.cpp factor.h
	$(CC) $(CFLAGS) -o $(OBJDIR)/$@ -c factor.cpp

cost_function.o: cost_function.cpp cost_function.h factor.h
	$(CC) $(CFLAGS) -o $(OBJDIR)/$@ -c cost_function.cpp

matrix_operation.o: matrix_operation.cpp
	$(CC) $(CFLAGS) -o $(OBJDIR)/$@ -c matrix_operation.cpp

cloud_client.o: cloud_client.cpp
	$(CC) $(CFLAGS) -o $(OBJDIR)/$@ -c cloud_client.cpp

gpu_client.o: gpu_client.cpp
	$(CC) $(CFLAGS) -o $(OBJDIR)/$@ -c gpu_client.cpp

clean:
	-rm -f $(TARGET)
	-rm -rf $(OBJDIR)
	@make -C Matrix clean
	@make -C Cloud clean
	
